package com.sundablog.service.impl.backend.system.upms.filesystem;

import java.io.File;
import java.util.HashMap;
import java.util.Map;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import com.jeesuite.filesystem.FSProvider;
import com.jeesuite.filesystem.UploadObject;
import com.jeesuite.filesystem.provider.aliyun.AliyunossProvider;
import com.jeesuite.filesystem.provider.fdfs.FdfsProvider;
import com.jeesuite.filesystem.provider.qiniu.QiniuProvider;
import com.sundablog.service.backend.system.upms.filesystem.FilesyStemService;

import cn.hutool.core.util.RandomUtil;

/**
 * 文件处理接口实现类(文件上传 、文件下载等)
 * 
 * @ClassName: FilesyStemServiceImpl
 * @Description:文件处理接口实现类(文件上传 、文件下载等)
 * @author: 哒哒
 * @date: 2018年3月30日 上午12:12:05
 * 
 * @Copyright: 2018 www.sundablog.com Inc. All rights reserved.
 */
@Service
public class FilesyStemServiceImpl implements FilesyStemService {

	@Value("${UPLOADING_QINIU_TYPE}")
	private int UPLOADING_QINIU_TYPE;

	/**
	 *  qiniu配置
	 */
	@Value("${QINIU_FILESYSTEM_PROVIDER}")
	private String QINIU_FILESYSTEM_PROVIDER;
	@Value("${QINIU_FILESYSTEM_BUCKETNAME}")
	private String QINIU_FILESYSTEM_BUCKETNAME;
	@Value("${QINIU_FILESYSTEM_URLPREFIX}")
	private String QINIU_FILESYSTEM_URLPREFIX;
	@Value("${QINIU_FILESYSTEM_ACCESSKEY}")
	private String QINIU_FILESYSTEM_ACCESSKEY;
	@Value("${QINIU_FILESYSTEM_SECRETKEY}")
	private String QINIU_FILESYSTEM_SECRETKEY;
	@Value("${QINIU_FILESYSTEM_PRIVATE}")
	private String QINIU_FILESYSTEM_PRIVATE;

	/**
	 * FASTDFS
	 */
	@Value("${FASTDFS_FILESYSTEM_PROVIDER}")
	private String FASTDFS_FILESYSTEM_PROVIDER;
	@Value("${FASTDFS_FILESYSTEM_SERVERS}")
	private String FASTDFS_FILESYSTEM_SERVERS;
	@Value("${FASTDFS_FILESYSTEM_URLPREFIX}")
	private String FASTDFS_FILESYSTEM_URLPREFIX;
	@Value("${FASTDFS_FILESYSTEM_CONNECTTIMEOUT}")
	private int FASTDFS_FILESYSTEM_CONNECTTIMEOUT;
	@Value("${FASTDFS_FILESYSTEM_MAXTHREADS}")
	private int FASTDFS_FILESYSTEM_MAXTHREADS;

	/**
	 * aliyun
	 */
	@Value("${ALIYUN_FILESYSTEM_PROVIDER}")
	private String ALIYUN_FILESYSTEM_PROVIDER;
	@Value("${ALIYUN_FILESYSTEM_BUCKETNAME}")
	private String ALIYUN_FILESYSTEM_BUCKETNAME;
	@Value("${ALIYUN_FILESYSTEM_ENDPOINT}")
	private String ALIYUN_FILESYSTEM_ENDPOINT;
	@Value("${ALIYUN_FILESYSTEM_ACCESSKEY}")
	private String ALIYUN_FILESYSTEM_ACCESSKEY;
	@Value("${ALIYUN_FILESYSTEM_SECRETKEY}")
	private String ALIYUN_FILESYSTEM_SECRETKEY;
	@Value("${ALIYUN_FILESYSTEM_URLPREFIX}")
	private String ALIYUN_FILESYSTEM_URLPREFIX;
	@Value("${ALIYUN_FILESYSTEM_PRIVATE}")
	private String ALIYUN_FILESYSTEM_PRIVATE;

	/**
	 * layui文件上传组件上传 Title: fileUploadLayui Description:
	 * 
	 * @param filContent
	 * @return
	 * @see com.sundablog.service.backend.system.upms.filesystem.FilesyStemService#fileUploadLayui(byte[])
	 */
	@Override
	public String fileUploadLayui(byte[] filContent) {
		String url; 
		if (UPLOADING_QINIU_TYPE == 0) {
			url = fdfsProvider(filContent);
		} else if (UPLOADING_QINIU_TYPE == 1) {
			url = aliyunossProvider(filContent);
		} else {
			url = qiniuProvider(filContent);
		}
		
		return url;
	}

	/**
	 * 获取文件下载URL Title: getDownloadUrl Description:
	 * 
	 * @param fileKey
	 * @return
	 * @see com.sundablog.service.backend.system.upms.filesystem.FilesyStemService#getDownloadUrl(java.lang.String)
	 */
	@Override
	public String getDownloadUrl(String fileKey) {
		String url; 
		if (UPLOADING_QINIU_TYPE == 0) {
			url = getFdfsDownloadUrl(fileKey);
		} else if (UPLOADING_QINIU_TYPE == 1) {
			url = getAliyunossDownloadUrl(fileKey);
		} else {
			url = getQiniuDownloadUrl(fileKey);
		}
		return url;
	}

	/**
	 * 7牛云 oss 文件上传
	 * @Title: qiniuProvider   
	 * @Description: TODO(这里用一句话描述这个方法的作用)   
	 * @param: @param filContent
	 * @param: @return      
	 * @return: String      
	 * @throws
	 */
	private String qiniuProvider(byte[] filContent) {
		FSProvider provider = new QiniuProvider(QINIU_FILESYSTEM_URLPREFIX, QINIU_FILESYSTEM_BUCKETNAME,
				QINIU_FILESYSTEM_ACCESSKEY, QINIU_FILESYSTEM_SECRETKEY, true);
		String url = provider.upload(new UploadObject(RandomUtil.simpleUUID(), filContent));
		return url;
	}
	/**
	 * 7牛云 文件下载url
	 * @Title: getQiniuDownloadUrl   
	 * @Description: TODO(这里用一句话描述这个方法的作用)   
	 * @param: @param fileKey
	 * @param: @return      
	 * @return: String      
	 * @throws
	 */
	public String getQiniuDownloadUrl(String fileKey) {
		FSProvider provider = new QiniuProvider(QINIU_FILESYSTEM_URLPREFIX, QINIU_FILESYSTEM_BUCKETNAME,
				QINIU_FILESYSTEM_ACCESSKEY, QINIU_FILESYSTEM_SECRETKEY, true);
		String url = provider.getDownloadUrl(fileKey);
		return url;
	}

	/**
	 * 阿里云oss文件上传
	 * @Title: aliyunossProvider   
	 * @Description: 阿里云oss文件上传
	 * @param: @param filContent
	 * @param: @return      
	 * @return: String      
	 * @throws
	 */
	private String aliyunossProvider(byte[] filContent) {
		FSProvider provider = new AliyunossProvider(ALIYUN_FILESYSTEM_URLPREFIX, ALIYUN_FILESYSTEM_ENDPOINT,
				ALIYUN_FILESYSTEM_BUCKETNAME, ALIYUN_FILESYSTEM_ACCESSKEY, ALIYUN_FILESYSTEM_SECRETKEY, true);
		String url = provider.upload(new UploadObject(RandomUtil.simpleUUID(), filContent));
		return url;
	}
	/**
	 * 阿里云oss文件下载url
	 * @Title: getAliyunossDownloadUrl   
	 * @Description: TODO(这里用一句话描述这个方法的作用)   
	 * @param: @param fileKey
	 * @param: @return      
	 * @return: String      
	 * @throws
	 */
	public String getAliyunossDownloadUrl(String fileKey) {
		FSProvider provider = new AliyunossProvider(ALIYUN_FILESYSTEM_URLPREFIX, ALIYUN_FILESYSTEM_ENDPOINT,
				ALIYUN_FILESYSTEM_BUCKETNAME, ALIYUN_FILESYSTEM_ACCESSKEY, ALIYUN_FILESYSTEM_SECRETKEY, true);
		String url = provider.getDownloadUrl(fileKey);
		return url;
	}

	/**
	 * fdfs文件上传
	 * @Title: fdfsProvider   
	 * @Description: fdfs文件上传
	 * @param: @param filContent
	 * @param: @return      
	 * @return: String      
	 * @throws
	 */
	private String fdfsProvider(byte[] filContent) {
		FSProvider provider = new FdfsProvider(FASTDFS_FILESYSTEM_URLPREFIX, "group1",
				new String[] { FASTDFS_FILESYSTEM_SERVERS }, FASTDFS_FILESYSTEM_CONNECTTIMEOUT,
				FASTDFS_FILESYSTEM_MAXTHREADS);
		String url = provider.upload(new UploadObject(RandomUtil.simpleUUID(), filContent));
		return url;
	}
	/**
	 * fdfs文件下载地址
	 * @Title: getFdfsDownloadUrl   
	 * @Description: TODO(这里用一句话描述这个方法的作用)   
	 * @param: @param fileKey
	 * @param: @return      
	 * @return: String      
	 * @throws
	 */
	public String getFdfsDownloadUrl(String fileKey) {
		FSProvider provider = new FdfsProvider(FASTDFS_FILESYSTEM_URLPREFIX, "group1",
				new String[] { FASTDFS_FILESYSTEM_SERVERS }, FASTDFS_FILESYSTEM_CONNECTTIMEOUT,
				FASTDFS_FILESYSTEM_MAXTHREADS);
		String url = provider.getDownloadUrl(fileKey);
		return url;
	}

}
